﻿// ------------------------------------------------------------------------
// Apache开源许可证
// 
// 版权所有 © 2018-Now 小方
// 
// 许可授权：
// 本协议授予任何获得本软件及其相关文档（以下简称“软件”）副本的个人或组织。
// 在遵守本协议条款的前提下，享有使用、复制、修改、合并、发布、分发、再许可、销售软件副本的权利：
// 1.所有软件副本或主要部分必须保留本版权声明及本许可协议。
// 2.软件的使用、复制、修改或分发不得违反适用法律或侵犯他人合法权益。
// 3.修改或衍生作品须明确标注原作者及原软件出处。
// 
// 特别声明：
// - 本软件按“原样”提供，不提供任何形式的明示或暗示的保证，包括但不限于对适销性、适用性和非侵权的保证。
// - 在任何情况下，作者或版权持有人均不对因使用或无法使用本软件导致的任何直接或间接损失的责任。
// - 包括但不限于数据丢失、业务中断等情况。
// 
// 免责条款：
// 禁止利用本软件从事危害国家安全、扰乱社会秩序或侵犯他人合法权益等违法活动。
// 对于基于本软件二次开发所引发的任何法律纠纷及责任，作者不承担任何责任。
// ------------------------------------------------------------------------

using System.Runtime.InteropServices;
using Fast.DynamicApplication;
using Fast.NET.Core;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Fast.Scheduler.Applications;

/// <summary>
/// <see cref="MachineApplication"/> 服务器信息
/// </summary>
[ApiDescriptionSettings(false)]
public class MachineApplication : IDynamicApplication
{
    /// <summary>
    /// 服务器信息
    /// </summary>
    /// <returns></returns>
    [HttpGet("/machine"), HttpGet("/machine/index")]
    [ApiInfo("服务器信息", HttpRequestActionEnum.Other)]
    [AllowAnonymous]
    public IActionResult Index()
    {
        var dateTime = DateTime.Now;

        var cpuRate = MachineUtil.GetSystemCpuRate();

        var (ramTotal, ramUsed, ramFree) = MachineUtil.GetSystemRamInfo();

        const decimal relation = 1024;

        return new JsonResult(new
        {
            // 当前时间
            CurrentTime = dateTime,
            // 运行时间
            RunTimes = MachineUtil.GetSystemRunTimes(),
            // 主机名称
            HostName = Environment.MachineName,
            // 操作系统
            OSName = MachineUtil.GetOSDescription(),
            // 系统架构
            OSArchitecture = $"{Environment.OSVersion.Platform.ToString()} {RuntimeInformation.OSArchitecture.ToString()}",
            // CPU核数
            CpuCount = $"{Environment.ProcessorCount} 核",
            // CPU使用率(%)
            CpuRate = cpuRate,
            // CPU使用率(%)
            CpuRatePercent = cpuRate.Select(sl => $"{sl} %")
                .ToList(),
            // 总内存(GB)
            RamTotal = Math.Round(ramTotal / relation, 2, MidpointRounding.AwayFromZero),
            // 总内存(GB)
            RamTotalGB = $"{ramTotal / relation:F2} GB",
            // 已用内存(GB)
            RamUsed = Math.Round(ramUsed / relation, 2, MidpointRounding.AwayFromZero),
            // 已用内存(GB)
            RamUsedGB = $"{ramUsed / relation:F2} GB",
            // 可用内存(GB)
            RamFree = Math.Round(ramFree / relation, 2, MidpointRounding.AwayFromZero),
            // 可用内存(GB)
            RamFreeGB = $"{ramFree / relation:F2} GB",
            // 内存使用率(%)
            RamRate = Math.Round(ramUsed / ramTotal * 100, 2, MidpointRounding.AwayFromZero),
            // 内存使用率(%)
            RamRatePercent = $"{ramUsed / ramTotal * 100:F2} %",
            // 硬盘信息
            DiskInfos = MachineUtil.GetDiskInfos()
        });
    }
}